package com.alpaak.common.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alpaak.common.utils.json.JsonDateValueProcessor;
import com.alpaak.common.utils.json.JsonStringValueProcessor;
import com.alpaak.common.utils.json.JsonTimestampValueProcessor;
import net.sf.ezmorph.object.DateMorpher;
import net.sf.json.JsonConfig;
import net.sf.json.util.JSONUtils;
import net.sf.json.util.PropertyFilter;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

public class JsonUtil {
	private static SerializeConfig mapping = new SerializeConfig();
	private static String dateFromat;
	static {
		dateFromat = "yyyy-MM-dd HH:mm:ss";
	}

	public static String toJSON(Object jsonText) {
		return JSON.toJSONString(jsonText, SerializerFeature.WriteDateUseDateFormat);
	}

	/**
	 * @Title: getDefualtJsonConfig @Description: json默认处理配置 @param @return
	 * 设定文件 @return JsonConfig 返回类型 @throws
	 */
	public static JsonConfig getDefualtJsonConfig() {
		// 转换的对象如果有Date类型，则必须通过转换
		JsonConfig jsonConfig = new JsonConfig();
		jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
		jsonConfig.registerJsonValueProcessor(String.class, new JsonStringValueProcessor());
		jsonConfig.registerJsonValueProcessor(Timestamp.class, new JsonTimestampValueProcessor());
		// 实现属性过滤器接口并重写apply()方法
		PropertyFilter pf = new PropertyFilter() {
			// @Override
			// 返回true则跳过此属性，返回false则正常转换
			public boolean apply(Object source, String name, Object value) {
				if (value == null) { // || String.valueOf(value).equals("")
					return true;
				}
				return false;
			}
		};
		// 将过滤器放入json-config中
		jsonConfig.setJsonPropertyFilter(pf);

		return jsonConfig;
	}

	// JSON相关的初始化
	// 日期格式注册允许的格式类型，否则日期格式处理会出错
	public static void initJsonEnv() {
		// 注意：这个必须在首次调用JSONObject.toBean之前初始化，否则toBean之后默认会为uti.Date类型建立一个默认的匹配器(BeanMorpher)，再注册DateMorpher之后会排在第二位
		// 而解析的时候是按顺序来匹配解析的所以还是用用到第一个默认建立的BeanMorpher,导致每次取到的都是当前时间
		// 下面列表里面列的格式是有顺序的，所以要从大到小匹配 如 "yyyy/MM/dd HH:mm:ss" 应该在 "yyyy/MM/dd"
		// 前面，否则解析 "2015/09/09 12:01:01" 时时间就会被丢掉
		JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] { "yyyy-MM-dd HH:mm:ss",
				"yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd" }));
	}



    /**
     * @param object
     * @return
     * @Title: toJSONString
     * @author:
     * @date: 2017年5月15日
     * @Description: 对象转json string
     * @throws:
     */
    public static String toJSONString(Object object) {
        return JSONObject.toJSONString(object);
    }

    /**
     * @param text
     * @param clazz
     * @return
     * @Title: parseObject
     * @author:
     * @date: 2017年5月15日
     * @Description: json转对象
     * @throws:
     */
    public static <T> T parseObject(String text, Class<T> clazz) {
        return JSONObject.parseObject(text, clazz);
    }

    /**
     * @param text
     * @param clazz
     * @return
     * @Title: parseArray
     * @author:
     * @date: 2017年5月15日
     * @Description: json转List
     * @throws:
     */
    public static <T> List<T> parseArray(String text, Class<T> clazz) {
        return JSONObject.parseArray(text, clazz);
    }

}
